//package com.example.userserver.service.impl;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.service.IService;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.example.commons.config.JWTConfigProperties;
//import com.example.commons.entity.UserDO;
//import com.example.commons.utils.ExceptionEnum;
//import com.example.commons.utils.JinZhiException;
//import com.example.commons.vo.TokenVO;
//import com.example.userserver.dao.UserDao;
//import com.example.userserver.service.AppUserService;
//import com.example.userserver.service.UserService;
//import com.example.userserver.util.JWTUtil;
//import lombok.AllArgsConstructor;
//import lombok.Data;
//import org.apache.commons.lang.StringUtils;
//import org.apache.shiro.SecurityUtils;
//import org.apache.shiro.authc.UsernamePasswordToken;
//import org.apache.shiro.subject.Subject;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cache.Cache;
//import org.springframework.stereotype.Service;
//
///**
// * <pre>
// * </pre>
// *
// * <small> 2018年4月27日 | Aron</small>
// */
//@Service
//@AllArgsConstructor
//@Data
//public class AppUserServiceImpl extends ServiceImpl<UserDao, UserDO> implements AppUserService {
//
//    @Autowired
//    private UserService userService;
//	/** Holder for lazy-init */
//	public static class Holder {
//		public static final JWTConfigProperties jwtConfig = SpringContextHolder.getBean(JWTConfigProperties.class);
//		public static final Cache logoutTokens = CacheConfiguration.dynaConfigCache(jwtConfig.getExpireTokenKeyPrefix(), jwtConfig
//                .getRefreshTokenExpire());
//	}
//
//	@Override
//    public TokenVO getToken(UsernamePasswordToken token) {
//        Subject subject = SecurityUtils.getSubject();
//        subject.login(token);
//        QueryWrapper<UserDO> user=new QueryWrapper<>();
//        user.eq("username", token.getUsername());
//        UserDO user1 = userService.getOne(user);
//
//        return JWTUtil.createToken(user1);
//
//    }
//
//    @Override
//	public void verifyToken(String token, boolean isRefreshToken) {
//        ensureAvailable(token, isRefreshToken);
//	}
//
//	@Override
//	public TokenVO refreshToken(String uname, String refreshToken) {
//
//        ensureAvailable(refreshToken, true);
//        QueryWrapper<UserDO> queryWrapper=new QueryWrapper<>();
//        queryWrapper.eq("username", uname);
//
//        UserDO user = userService.getOne(queryWrapper);
//        if(user == null){
//            throw new JinZhiException(ExceptionEnum.USER_FAIL.getStatus(), ExceptionEnum.USER_FAIL.getMessage());
//        }
//
//		return JWTUtil.createToken(user);
//	}
//
//
//
//	@Override
//	public void logoutToken(String token, String refreshToken) {
//        Holder.logoutTokens.putIfAbsent(token, null);
//        Holder.logoutTokens.putIfAbsent(refreshToken, null);
//	}
//
//	private void ensureAvailable(String token, boolean isRefreshToken) {
//        if(StringUtils.isBlank(token)){
//            throw new JinZhiException(ExceptionEnum.USER_FAIL.getStatus(), ExceptionEnum.USER_FAIL.getMessage());
//
//        }
//        String userId = JWTUtil.getWxUserId(token);
//        if(StringUtils.isBlank(userId)){
//        //    throw new IFastException(EnumErrorCode.apiAuthorizationInvalid.getCodeStr());
//            throw new JinZhiException(ExceptionEnum.USER_FAIL.getStatus(), ExceptionEnum.USER_FAIL.getMessage());
//
//        }
//        if(Holder.logoutTokens.get(token) != null){
//            throw new JinZhiException(ExceptionEnum.TOKENFIAL.getStatus(), ExceptionEnum.TOKENFIAL.getMessage());
//
//           // throw new IFastApiException(EnumErrorCode.apiAuthorizationLoggedout.getCodeStr());
//        }
//
//      //  UserDO userDO = selectById(userId);
//        UserDO userDO =   userService.getById(userId);
//        if(userDO == null){
//            throw new JinZhiException(ExceptionEnum.USER_NULL_FAIL.getStatus(), ExceptionEnum.USER_NULL_FAIL.getMessage());
//            //throw new IFastException(EnumErrorCode.apiAuthorizationInvalid.getCodeStr());
//        }
//
//        if(isRefreshToken){
//            JWTUtil.verify(token, userDO.getId() + "", userDO.getUsername() + userDO.getPassword(), true);
//        }else{
//            JWTUtil.verify(token, userDO.getId() + "", userDO.getUsername() + userDO.getPassword());
//        }
//	}
//}
